1 问题描述
使用nginx uWSGI django 做REST API开发。
在URL中传入http://host/test/http://aa.com/
,但在Django中收到的URI始终是http:/aa.com
,嗯,就是少了斜杠,后来尝试发现多少个连续的斜杠都会被干掉只留下一个。
2 解决途径
- 查看nginx和uWSGI的日志,请求的路径都是正确的,即都为没有去掉斜杠的
- 查看Django源码,发现在django.core.handlers.base.BaseHandler中,处理URL匹配的时候使用的是path_info对应的值
- 于是找到处理类在django.core.handlers.wsgi.WSGIHandler,在这里打印请求获取到的path_info参数,发现已经是被去掉斜线的了。
- 怀疑是Nginx传过来的时候已经被处理过了
- 于是查看Nginx配置目录下,Nginx向uWSGI传的参数
uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri;
- 于是把$document_url打印到Nginx的日志中,发现确实是处理过的
- 想看看在哪处理的,下了一份Nginx源码,翻到src/http/ngx_http_parse.c 果然有相关的逻辑(意思是配了这个值的话就不把重复的写进去了^_^废话)
if (!merge_slashes) { *u++ = ch; }
- 能不能改改?翻了翻Nginx的模块配置文档发现可以,就用这个关键字搜
- 当然最后的解决办法不是直接修改这个配置,而是将要放在URL中的那一串串作为base64编码的结果再传递
3 参考
- nginx源码分析(7)——请求处理
- Nginx开发从入门到精通
- 运维与架构手册
- linux下安装nginx、pcre、zlib、openssl
- nginx编译选项详解
- Module ngx_http_core_module
- Nginx merge_slashes redirect
最后更新: 2022年03月02日 03:32
原始链接: http://rawbin-.github.io/nginx/2015-04-18-nginx-source-code/